MSVC Builds: Add Script to Generate gtk-win32.rc
authorChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 4 Aug 2014 05:34:15 +0000 (13:34 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 4 Aug 2014 05:34:15 +0000 (13:34 +0800)
In bug 733773, gtk-win32.rc was removed from the dist in the attempt to
make the print dialog on Windows themed, so this script was added so that
the gtk-win32.rc file can be generated during the Visual Studio builds of
GTK+ from the autotools scripts.  This is also intended for filling in the
arch of the build for MSVC builds for the manifest that is also required
for fixing bug 733773.  Python is used as it is already needed for

This is done as a custom build rule in the Visual Studio projects so that
it is easy to clean and rebuild gtk-win32.rc upon an update.

https://bugzilla.gnome.org/show_bug.cgi?id=733773

build/win32/Makefile.am
build/win32/process-in-win32.py [new file with mode: 0644]
build/win32/vs10/gtk-gen-srcs.props
build/win32/vs10/gtk.vcxproj.filtersin
build/win32/vs10/gtk.vcxprojin
build/win32/vs9/gtk-gen-srcs.vsprops
build/win32/vs9/gtk.vcprojin

index b72d35d9fecbfef2f87dee6e48f6551273ea0d4d..6cbb59645d556c63f9818cefe272792d2140409c 100644 (file)
@@ -7,4 +7,6 @@ SUBDIRS =       \
        vs11    \
        vs12
 
+EXTRA_DIST += process-in-win32.py
+
 -include $(top_srcdir)/git.mk
diff --git a/build/win32/process-in-win32.py b/build/win32/process-in-win32.py
new file mode 100644 (file)
index 0000000..00c4c01
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# vim: encoding=utf-8
+# expand Windows-specific *.in files
+# for Visual Studio Builds
+
+import os
+import sys
+import re
+import string
+import argparse
+
+
+def open_compat(src, mode):
+    if (sys.version_info.major < 3):
+        return open(src, mode)
+    else:
+        return open(src, mode, encoding='utf-8', errors='surrogateescape')
+
+def get_version(srcroot):
+    ver = {}
+    RE_VERSION = re.compile(r'^m4_define\(\[(gtk_\w+)\],\s*\[(\d+)\]\)')
+    RE_FLOAT_VERSION = re.compile(r'^m4_define\(\[(gtk_\w+)\],\s*\[(\d+\.\d*)\]\)')
+    with open(os.path.join(srcroot, 'configure.ac'), 'r') as ac:
+        for i in ac:
+            mo = RE_VERSION.search(i)
+            if mo:
+                ver[mo.group(1).upper()] = int(mo.group(2))
+            mo = RE_FLOAT_VERSION.search(i)
+            if mo:
+                ver[mo.group(1).upper()] = float(mo.group(2))
+
+    ver['GTK_BINARY_AGE'] = 100 * ver['GTK_MINOR_VERSION'] + ver['GTK_MICRO_VERSION']
+    ver['GTK_VERSION'] = '%d.%d.%d' % (ver['GTK_MAJOR_VERSION'],
+                                        ver['GTK_MINOR_VERSION'],
+                                        ver['GTK_MICRO_VERSION'])
+    ver['LT_RELEASE'] = '%d.%d' % (ver['GTK_MAJOR_VERSION'], ver['GTK_MINOR_VERSION'])
+    ver['LT_CURRENT'] = 100 * \
+                        ver['GTK_MINOR_VERSION'] + \
+                        ver['GTK_MICRO_VERSION'] - \
+                        ver['GTK_INTERFACE_AGE']
+    ver['LT_REVISION'] = ver['GTK_INTERFACE_AGE']
+    ver['LT_AGE'] = ver['GTK_BINARY_AGE'] - ver['GTK_INTERFACE_AGE']
+    ver['LT_CURRENT_MINUS_AGE'] = ver['LT_CURRENT'] - ver['LT_AGE']
+    return ver
+
+def process_in(src, dest, vars):
+    RE_VARS = re.compile(r'@(\w+?)@')
+
+    with open_compat(src, 'r') as s:
+        with open_compat(dest, 'w') as d:
+            for i in s:
+                i = RE_VARS.sub(lambda x: str(vars[x.group(1)]), i)
+                d.write(i)
+
+def get_srcroot():
+    if not os.path.isabs(__file__):
+        path = os.path.abspath(__file__)
+    else:
+        path = __file__
+    dirname = os.path.dirname(path)
+    return os.path.abspath(os.path.join(dirname, '..', '..'))
+
+def main(argv):
+    prog_desc = 'Create Various autogenerated Win32-specific Source Files'
+    parser = argparse.ArgumentParser(description=prog_desc)
+    parser.add_argument('--gtkwin32rc', dest='gtkwin32rc', action='store_const',
+                        const=1,
+                        help='Generate gtk-win32.rc')
+
+    parser.add_argument('--gtk3manifest', dest='gtk3manifest', action='store_const',
+                   const=1,
+                   help='Generate libgtk3.manifest (Not used now)')
+
+    args = parser.parse_args()
+    no_args = True
+
+    if args.gtkwin32rc is not None:
+        srcroot = get_srcroot()
+
+        ver = get_version(srcroot)
+
+        process_in(os.path.join(srcroot, 'gtk', 'gtk-win32.rc.in'),
+                   os.path.join(srcroot, 'gtk', 'gtk-win32.rc'),
+                   ver)
+        no_args = False
+
+    if args.gtk3manifest is not None:
+        print('Not Used... Will add once gtk/libgtk3.manifest.in is added')
+        #manifest = {}
+        #manifest['EXE_MANIFEST_ARCHITECTURE'] = '*'
+        #process_in(os.path.join(srcroot, 'gtk', 'libgtk3.manifest.in',
+        #           os.path.join(srcroot, 'gtk', 'libgtk3.manifest',
+        #           manifest)
+        no_args = False
+
+    if no_args is True:
+        raise SystemExit('Action argument required.  Please see %s --help for details.' % __file__)
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
index 7afca8a2a731eee99e100c141f695e220ac4d06a..c86b6b00c76ed3241d8df1dce522ca12d4909db8 100644 (file)
@@ -58,14 +58,13 @@ echo $(Configuration) &gt; ..\..\..\MSVC_$(Configuration)
 :DONE_GDKCONFIG_H
     </GenGdkConfigHBroadway>
     <GenerateGtkDbusBuiltSources>
-set PATH=$(PATH);$(PythonPath)
-
 cd ..\..\..\gtk
 
-python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml
+$(PythonPath)\python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml
 
 cd $(SolutionDir)
     </GenerateGtkDbusBuiltSources>
+    <GenerateGtkWin32RC>$(PythonPath)\python ..\process-in-win32.py --gtkwin32rc</GenerateGtkWin32RC>
   </PropertyGroup>
   <PropertyGroup>
     <_PropertySheetDisplayName>gtkgensrcsprops</_PropertySheetDisplayName>
@@ -83,5 +82,8 @@ cd $(SolutionDir)
     <BuildMacro Include="GenerateGtkDbusBuiltSources">
       <Value>$(GenerateGtkDbusBuiltSources)</Value>
     </BuildMacro>
+    <BuildMacro Include="GenerateGtkWin32RC">
+      <Value>$(GenerateGtkWin32RC)</Value>
+    </BuildMacro>
   </ItemGroup>
-</Project>
\ No newline at end of file
+</Project>
index f6be8055fcf915f27118ed20a96e498b415bb887..da9351127e2343a3389ec425370ab33cfb7324da 100644 (file)
@@ -19,6 +19,7 @@
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="..\..\..\gtk\gtkdbusinterfaces.xml"><Filter>Resource Files</Filter></CustomBuild>
+    <CustomBuild Include="..\..\..\gtk\gtk-win32.rc.in"><Filter>Resource Files</Filter></CustomBuild>
   </ItemGroup>
   <ItemGroup>
 #include "libgtk.vs10.sourcefiles.filters"
index 068677536504626c029e8d31bde166d9f34a1e8e..80af761ff3e9e6bb80e74f41f8b435f3a1ec3548 100644 (file)
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GenerateGtkDbusBuiltSources)</Command>
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
     </CustomBuild>
+    <CustomBuild Include="..\..\..\gtk\gtk-win32.rc.in">
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating GTK+ Win32 Version Resource...</Message>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(GenerateGtkWin32RC)</Command>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generating GTK+ Win32 Version Resource...</Message>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(GenerateGtkWin32RC)</Command>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generating GTK+ Win32 Version Resource...</Message>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(GenerateGtkWin32RC)</Command>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generating GTK+ Win32 Version Resource...</Message>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GenerateGtkWin32RC)</Command>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
+    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\..\gtk\gtk-win32.rc" />
index 7b1d0db2344e6bbb3407a67e0694bb8bfcda61ca..24ac945f792c4108600c2025f8cf4d904ce5ff2e 100644 (file)
@@ -57,11 +57,13 @@ echo $(ConfigurationName) &gt; ..\..\..\MSVC_$(ConfigurationName)&#x0D;&#x0A;
        <UserMacro
                Name="GenerateGtkDbusBuiltSources"
                Value="
-set PATH=$(PATH);$(PythonPath)&#x0D;&#x0A;
-
 cd ..\..\..\gtk&#x0D;&#x0A;
-python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml&#x0D;&#x0A;
+$(PythonPath)\python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml&#x0D;&#x0A;
 cd $(SolutionDir)&#x0D;&#x0A;
                      "
        />
-</VisualStudioPropertySheet>
\ No newline at end of file
+       <UserMacro
+               Name="GenerateGtkWin32RC"
+               Value="$(PythonPath)\python ..\process-in-win32.py --gtkwin32rc"
+       />
+</VisualStudioPropertySheet>
index b7e40c798f6714b15a6ef725dda4d84957d930e3..3dc5477c8827a3f422a9c615159f2e6073ff4eab 100644 (file)
                                        />
                                </FileConfiguration>
                        </File>
+                       <File RelativePath="..\..\..\gtk\gtk-win32.rc.in">
+                               <FileConfiguration Name="Debug|Win32">
+                               <Tool Name="VCCustomBuildTool"
+                                               Description="Generating GTK+ Win32 Version Resource..."
+                                               CommandLine="$(GenerateGtkWin32RC)"
+                                               Outputs="..\..\..\gtk\gtk-win32.rc"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration Name="Release|Win32">
+                                       <Tool Name="VCCustomBuildTool"
+                                               Description="Generating GTK+ Win32 Version Resource..."
+                                               CommandLine="$(GenerateGtkWin32RC)"
+                                               Outputs="..\..\..\gtk\gtk-win32.rc"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration Name="Debug|x64">
+                                       <Tool Name="VCCustomBuildTool"
+                                               Description="Generating GTK+ Win32 Version Resource..."
+                                               CommandLine="$(GenerateGtkWin32RC)"
+                                               Outputs="..\..\..\gtk\gtk-win32.rc"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration Name="Release|x64">
+                                       <Tool Name="VCCustomBuildTool"
+                                               Description="Generating GTK+ Win32 Version Resource..."
+                                               CommandLine="$(GenerateGtkWin32RC)"
+                                               Outputs="..\..\..\gtk\gtk-win32.rc"
+                                       />
+                               </FileConfiguration>
+                       </File>
                        <File RelativePath="..\..\..\gtk\gtk-win32.rc" />
                </Filter>
                <Filter